package cn.com.blueInfo.bpm.person.service.impl;

import cn.com.blueInfo.bpm.person.convert.PostConvert;
import cn.com.blueInfo.bpm.person.entity.Post;
import cn.com.blueInfo.bpm.person.repository.PostRepository;
import cn.com.blueInfo.bpm.person.request.PostDTO;
import cn.com.blueInfo.bpm.person.response.PostVO;
import cn.com.blueInfo.bpm.person.service.PostService;
import cn.com.blueInfo.core.util.SnowflakeIdGenerator;
import cn.com.blueInfo.utils.result.ResultInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 岗位与组织关系表 业务服务实现类
 * @author suxch
 * @since 2025-09-01 19:28:09
 */
@Log4j2
@Service
public class PostServiceImpl implements PostService {

    @Autowired
    private PostRepository postRepository;

    @Autowired
    private SnowflakeIdGenerator snowflakeIdGenerator;

    @Autowired
    private PostConvert postConvert;

    /**
     * 新增岗位与组织关系
     * @param postDTO 岗位与组织关系参数
     */
    @Override
    public ResultInfo<Integer> addPost(PostDTO postDTO) {
        Post post = postConvert.dtoToEntity(postDTO);
        post.setId(snowflakeIdGenerator.nextId());
        Integer addSize = postRepository.createPost(post);
        return ResultInfo.<Integer>builder().data(addSize).message("岗位与组织关系成功新增 {} 条").build();
    }

    /**
     * 批量新增岗位与组织关系
     * @param postDTOList 岗位与组织关系参数列表
     */
    @Override
    public ResultInfo<Integer> batchAddPost(List<PostDTO> postDTOList) {
        List<Post> postList = postConvert.dtoToEntity(postDTOList);
        for (Post post : postList) post.setId(snowflakeIdGenerator.nextId());
        Integer addSize = postRepository.batchCreatePost(postList);
        return ResultInfo.<Integer>builder().data(addSize).message("岗位与组织关系成功新增 {} 条").build();
    }

    /**
     * 删除岗位与组织关系
     * @param postId 岗位与组织关系ID
     */
    @Override
    public ResultInfo<Integer> removePost(Long postId) {
        Integer removeSize = postRepository.deletePost(postId);
        return ResultInfo.<Integer>builder().data(removeSize).message("岗位与组织关系成功删除 {} 条").build();
    }

    /**
     * 批量删除岗位与组织关系
     * @param postIdList 岗位与组织关系ID列表
     */
    @Override
    public ResultInfo<Integer> batchRemovePost(List<Long> postIdList) {
        Integer removeSize = postRepository.batchDeletePost(postIdList);
        return ResultInfo.<Integer>builder().data(removeSize).message("岗位与组织关系成功删除 {} 条").build();
    }

    /**
     * 更新部分岗位与组织关系
     * @param postUpdatePartialDTO 岗位与组织关系参数
     */
    @Override
    public ResultInfo<Integer> modifyPostPartial(PostDTO.UpdatePartialDTO postUpdatePartialDTO) {
        Post post = postConvert.dtoToEntity(postUpdatePartialDTO);
        Integer modifySize = postRepository.updatePostPartial(post);
        return ResultInfo.<Integer>builder().data(modifySize).message("岗位与组织关系成功更新 {} 条").build();
    }

    /**
     * 更新全部岗位与组织关系
     * @param postDTO 岗位与组织关系参数
     */
    @Override
    public ResultInfo<Integer> modifyPost(PostDTO postDTO) {
        Post post = postConvert.dtoToEntity(postDTO);
        Integer modifySize = postRepository.updatePost(post);
        return ResultInfo.<Integer>builder().data(modifySize).message("岗位与组织关系成功更新 {} 条").build();
    }

    /**
     * 查询一条岗位与组织关系
     * @param postId 岗位与组织关系ID
     */
    @Override
    public ResultInfo<PostVO> queryPostById(Long postId) {
        Post post = postRepository.getPostById(postId);
        PostVO postVO = postConvert.entityToVO(post);
        return ResultInfo.<PostVO>builder().data(postVO).message("岗位与组织关系查询成功").build();
    }

    /**
     * 分页查询岗位与组织关系
     * @param postQueryDTO 岗位与组织关系参数
     */
    @Override
    public ResultInfo<Page<PostVO>> queryPostPage(PostDTO.QueryDTO postQueryDTO) {
        Page<Post> postPage = postRepository.getPostPage(postQueryDTO);
        Page<PostVO> resultData = postConvert.convertPage(postPage);
        return ResultInfo.<Page<PostVO>>builder()
                .data(resultData)
                .message("岗位与组织关系分页查询成功，共 {} 条", resultData.getRecords().size())
                .build();
    }

    /**
     * 根据条件查询 岗位与组织关系 数量
     * @param postQueryDTO 岗位与组织关系参数
     */
    @Override
    public ResultInfo<Long> queryPostCount(PostDTO.QueryDTO postQueryDTO) {
        Long resultCount = postRepository.getPostCount(postQueryDTO);
        return ResultInfo.<Long>builder()
                .data(resultCount)
                .message("岗位与组织关系数量查询成功，共 {} 条", resultCount)
                .build();
    }

    /**
     * 根据条件查询 岗位与组织关系
     * @param postQueryDTO 岗位与组织关系参数
     */
    @Override
    public ResultInfo<List<PostVO>> queryPostList(PostDTO.QueryDTO postQueryDTO) {
        List<Post> postList = postRepository.getPostList(postQueryDTO);
        List<PostVO> resultData = postConvert.entityListToVoList(postList);
        return ResultInfo.<List<PostVO>>builder()
                .data(resultData)
                .message("岗位与组织关系分页查询成功，共 {} 条", resultData.size())
                .build();
    }
}
